﻿using System;
using System.Web;

namespace rosata.Providers.Session
{
    public class UserSessionValuesInHttpContext : IUserSessionProvider
    {
        /// <summary>
        /// se c'è un utente nella sessione lo prende altrimenti lo crea
        /// </summary>
        /// <returns></returns>
        public DatiUtenteDm GetUserValuesFromSession()
        {
            //inizialmente provo a prenderlo dalla sessione, se c'è li ci è andata di culo
            if (HttpContext.Current.Session["UserValues"] != null)
            {
                var userSessionValues = HttpContext.Current.Session["UserValues"] as DatiUtenteDm;

                var httpCookie = HttpContext.Current.Request.Cookies["UserValues"];
                if (httpCookie == null)
                {
                    //se non ho il cookie, lo creo e gli assegno id della sessione
                    HttpCookie cookieUserSettings = new HttpCookie("UserValues");
                    Guid guidUserId = Guid.NewGuid();
                    cookieUserSettings["UserId"] = guidUserId.ToString();
                    cookieUserSettings.Expires = DateTime.Now.AddYears(1);
                    HttpContext.Current.Response.Cookies.Add(cookieUserSettings);
                }
                return userSessionValues;
            }

            datiUtente = new DatiUtenteDm
            {
                Id = Guid.NewGuid()
            };

            //non ho il valore nella sesssione, proviamo a vedere se c'è nei cookie
            if (HttpContext.Current.Request.Cookies["UserValues"] != null)
            {
                //ho il valore della sessione nel cookie allora lo leggo e ritorno il valore
                string userId = HttpContext.Current.Request.Cookies["UserValues"]["UserId"];

                if (!string.IsNullOrEmpty(userId))
                    datiUtente.Id = new Guid(userId);

                HttpContext.Current.Session["UserValues"] = datiUtente;
                return datiUtente;
            }

            //arrivati qui non abbiamo il valore ne nei cookie ne 
            //nella sessione quindi dobbiamo crearlo noi a caso

            //mettiamo il valore nella sessione
            HttpContext.Current.Session["UserValues"] = datiUtente;

            //poi nei cookie
            HttpCookie cookieUserSettingsFinal = new HttpCookie("UserValues");
            cookieUserSettingsFinal["UserId"] = datiUtente.Id.ToString();
            cookieUserSettingsFinal.Expires = DateTime.Now.AddYears(1);
            HttpContext.Current.Response.Cookies.Add(cookieUserSettingsFinal);

            return datiUtente;
        }

        public void PutUserValuesToSession(DatiUtenteDm datiUtente)
        {
            //non solo settare  la sessione, ma anche impostare i cookie
            HttpContext.Current.Session["UserValues"] = datiUtente;

            //nel caso in cui il cookie sia nullo, lo devo settare perche poi mi servira più avanti
            //if (HttpContext.Current.Request.Cookies["UserValues"] == null)
            //{
                //se il valore del cookie è nullo devo crearlo s ficcarci dentro l'id dell'utente
                HttpCookie cookieUserSettingsFinal = new HttpCookie("UserValues");
                cookieUserSettingsFinal["UserId"] = datiUtente.Id.ToString();
                cookieUserSettingsFinal.Expires = DateTime.Now.AddYears(1);
                HttpContext.Current.Response.Cookies.Add(cookieUserSettingsFinal);
            //}
        }

        public bool ExistUserInSession()
        {
            var sessionVariablesInHttpContext = HttpContext.Current.Session["UserValues"] as DatiUtenteDm;
            var sessionVariablesInCookie = HttpContext.Current.Request.Cookies["UserValues"];

            if (sessionVariablesInHttpContext == null && sessionVariablesInCookie == null)
                return false;
            else
                return true;
        }

        /// <summary>
        /// ritorna true se è una sessione di amministratore, false altrimenti
        /// </summary>
        /// <returns></returns>
        public bool IsAdminSession()
        {
            var adminUserValuesDto = HttpContext.Current.Session["AdminUserValuesDto"] as AdminUserValuesDto;

            if (adminUserValuesDto == null)
                return false;
            else
                return true;
        }
        
        public bool LogAdmin(string username, string password)
        {
            if (username == "rosata" && password == "rosata")
            {
                AdminUserValuesDto adminUserValuesDto = new AdminUserValuesDto { Username = username, Password = password };
                HttpContext.Current.Session["AdminUserValuesDto"] = adminUserValuesDto;
                return true;
            }

            else
                return false;
        }

        public DatiUtenteDm datiUtente { get; set; }
    }
}
